/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package camada.bancodedados.daoimplemente.orcamento;

import camada.bancodedados.conexao.Conexao;
import camada.negocio.dao.orcamento.ProdutoOrcamentoDAO;
import eloma.classe.orcamento.MaterialProdutoOrcamento;
import eloma.classe.orcamento.ProdutoOrcamento;
import eloma.classe.orcamento.TipoProduto;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import utilitarios.Exceptions;

/**
 *
 * @author icaro.klinger
 */
public class ProdutoOrcamentoDAOImpl implements ProdutoOrcamentoDAO {

    //<editor-fold desc="Variáveis">
    Exceptions exceptions = new Exceptions();
    MaterialProdutoOrcamentoDAOImpl daoMaterialProdutoOrcamento = new MaterialProdutoOrcamentoDAOImpl();
    TipoProdutoDAOImpl daoTipoProduto = new TipoProdutoDAOImpl();
    //</editor-fold>

    @Override
    //<editor-fold desc="inserirProdutoOrcamento">
    public int inserirProdutoOrcamento(ProdutoOrcamento orc, int idOrcamento) {
        PreparedStatement pstm = null;
        int id = 0;
        try {
            final String SQL_INSERT
                    = "insert into ProdutoOrcamento(idTipoProduto, idOrcamento, valorAluminio, largura, comprimento)values(?,?,?,?,?)";
            pstm = Conexao.getCon().prepareStatement(SQL_INSERT);
            pstm.setInt(1, orc.getTipoProduto().getIdTipoProduto());
            pstm.setInt(2, idOrcamento);
            pstm.setDouble(3, orc.getValorAluminio());
            pstm.setDouble(4, orc.getLargura());
            pstm.setDouble(5, orc.getComprimento());
            pstm.executeUpdate();

            String query = "select idProdutoOrcamento from ProdutoOrcamento";
            ResultSet rs = pstm.executeQuery(query);

            while (rs.next()) {
                id = rs.getInt("idProdutoOrcamento");
            }

        } catch (SQLException e) {
            exceptions.Exceptions(e.getCause().toString(), "ProdutoOrcamentoDAOImpl-Inserir");
            return 0;
        }

        return id;
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="pesquisarProdutoOrcamentoPorIdentificadorOrcamento - Método faz busca em outra tabela">
    public List<ProdutoOrcamento> pesquisarProdutoOrcamentoPorIdentificadorOrcamento(int idOrcamento) throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        try {
            final String SQL_PESQUISA_CLIENTE = "select * from ProdutoOrcamento where idOrcamento = " + idOrcamento;
            stmt = Conexao.getCon().prepareStatement(SQL_PESQUISA_CLIENTE);
            rs = stmt.executeQuery();
            return carregarMultiplosResultados(rs);
        } catch (SQLException sqle) {
            throw new Exception(sqle);
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="atualizarProdutoOrcamento">
    public void atualizarProdutoOrcamento(ProdutoOrcamento orc) {
        PreparedStatement pstm = null;
        try {
            final String SQL_UPDATE
                    = "UPDATE ProdutoOrcamento SET idTipoProduto = ? , valorAluminio = ?, largura = ?, comprimento = ? where idProdutoOrcamento = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_UPDATE);
            pstm.setInt(1, orc.getTipoProduto().getIdTipoProduto());
            pstm.setDouble(2, orc.getValorAluminio());
            pstm.setDouble(3, orc.getLargura());
            pstm.setDouble(4, orc.getComprimento());
            pstm.setInt(5, orc.getIdProdutoOrcamento());
            pstm.executeUpdate();
        } catch (SQLException e) {
            System.out.println("Erro ao atualizar dados!!!\n" + e.getMessage());
        }
    }
    //</editor-fold>

    @Override
    //<editor-fold desc="removerProdutoOrcamento">
    public void removerProdutoOrcamento(ProdutoOrcamento orc) {
        PreparedStatement pstm = null;
        try {
            final String SQL_DELETE = "delete from ProdutoOrcamento where idProdutoOrcamento = ?";
            pstm = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_DELETE);
            pstm.setInt(1, orc.getIdProdutoOrcamento());
            pstm.executeUpdate();
        } catch (SQLException e) {
            System.out.println("Erro ao inserir dados!!!\n" + e.getMessage());
        }

    }
    //</editor-fold>

    @Override
    //<editor-fold desc="pesquisarTodosProdutoOrcamento">
    public List<ProdutoOrcamento> pesquisarTodosProdutoOrcamento() throws Exception {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        String SQL_STATEMENT = "Select * from ProdutoOrcamento";
        try {
            stmt = (PreparedStatement) Conexao.getCon().prepareStatement(SQL_STATEMENT);
            rs = stmt.executeQuery();
            return carregarMultiplosResultados(rs);
        } catch (SQLException sqle) {
            throw new Exception(sqle);
        } catch (Exception e) {
            throw new Exception(e);
        } finally {
        }
    }
    //</editor-fold>

    //<editor-fold desc="carregarMultiplosResultados">
    public List<ProdutoOrcamento> carregarMultiplosResultados(ResultSet rs) throws SQLException {
        List<ProdutoOrcamento> resultList = new ArrayList<ProdutoOrcamento>();
        while (rs.next()) {
            ProdutoOrcamento dto = new ProdutoOrcamento();
            carregarVO(dto, rs);
            resultList.add(dto);
        }
        return resultList;
    }
    //</editor-fold>

    //<editor-fold desc="carregarResultadoSimples">
    private ProdutoOrcamento carregarResultadoSimples(ResultSet rs) throws SQLException {
        if (rs.next()) {
            ProdutoOrcamento dto = new ProdutoOrcamento();
            carregarVO(dto, rs);
            return dto;
        } else {
            return null;
        }
    }
    //</editor-fold>

    //<editor-fold desc="carregarVO">
    private void carregarVO(ProdutoOrcamento dto, ResultSet rs) throws SQLException {
        try {
            dto.setIdProdutoOrcamento(rs.getInt("idProdutoOrcamento"));

            TipoProduto tipoProduto = daoTipoProduto.pesquisarTipoProdutoPorIdentificador(rs.getInt("idTipoProduto"));
            dto.setTipoProduto(tipoProduto);

            dto.setValorAluminio(rs.getDouble("valorAluminio"));
            dto.setLargura(rs.getDouble("largura"));
            dto.setComprimento(rs.getDouble("comprimento"));

            //Busca materiais do produto tabela MaterialProdutoOrcamento pelo idProdutoOrcamento
            List<MaterialProdutoOrcamento> listaMaterialProdutoOrcamento = daoMaterialProdutoOrcamento.pesquisarMaterialProdutoOrcamentoPorIdentificadorProdutoOrcamento(rs.getInt("idProdutoOrcamento"));
            dto.setListaMaterialOrcamento(listaMaterialProdutoOrcamento);

        } catch (Exception e) {
        }
    }
    //</editor-fold>
}
